﻿using System;
using System.Collections.Generic;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;

namespace WCYCReader.SocketServer.Models
{
    /// <summary>
    /// 与客户端的 连接通信类(包含了一个 与客户端 通信的 套接字，和线程)
    /// </summary>
    public class SocketClient
    {
        Socket sokMsg;
        Thread threadMsg;

        // 通信操作完成时调用，用来触发在操作完成时，在宿主页面显示消息提示
        public event EventHandler<string> Completed;

        public SocketClient(Socket sokMsg)
        {
            this.sokMsg = sokMsg;

            this.threadMsg = new Thread(ReceiveMsg);
            this.threadMsg.IsBackground = true;
            this.threadMsg.Start();
        }

        bool isRec = true;
        // 负责监听客户端发送来的消息
        void ReceiveMsg()
        {
            while (isRec)
            {
                try
                {
                    byte[] byteSrc = new byte[CommonHelper.FileLength];

                    // 从绑定的 Socket 套接字接收数据，将数据存入接收缓冲区。
                    int length = sokMsg.Receive(byteSrc);

                    DataType dataType;
                    byte[] bytesFile;
                    string strMsg;

                    // 转换源 byte[] 数据内容，获取其中的 head 和 body 的实际内容
                    CommonHelper.ConvertByteToData(byteSrc, out dataType, out bytesFile, out strMsg);

                    if (dataType.IsFile == true)
                    {
                        // 如果 body 的类型文件，则直接将文件存储到 PC 端的 D: 盘根路径下
                        using (FileStream file = new FileStream("d:\\" + dataType.FileName + dataType.Exten, FileMode.OpenOrCreate))
                        {
                            file.Write(bytesFile, 0, bytesFile.Length);
                        }

                        // 显示回调消息
                        OnCompleted("客户端发送的文件：" + dataType.FileName + dataType.Exten);
                        OnCompleted("该文件保存在 D: 盘的根目录下");
                    }
                    else
                    {
                        OnCompleted(">>客户端：" + strMsg);
                    }

                }
                catch (Exception ex)
                {
                    // 如果抛异常，则释放该 Socket 对象所占用的资源
                    CloseConnection();

                    OnCompleted("SocketClient.ReceiveMsg() :" + ex.Message);
                }
            }
        }

        /// <summary>   
        ///  向客户端发送消息   
        /// </summary>
        /// <param name="strMsg"></param>
        public void Send(string strMsg)
        {
            byte[] arrMsgFinal = CommonHelper.ConvertDataToByte(new DataType { IsFile = false }, null, strMsg);

            sokMsg.Send(arrMsgFinal);
        }

        // 向客户端发送文件数据
        public void SendFile(string strPath)
        {
            try
            {
                byte[] arrFileFina = CommonHelper.ConvertDataToByte(new DataType { IsFile = true }, strPath, null);

                //发送文件数据
                sokMsg.Send(arrFileFina);//, 0, length + 1, SocketFlags.None);
                OnCompleted("发送文件完成");
            }
            catch (Exception ex)
            {
                OnCompleted(ex.Message);
            }
        }

        // 关闭与客户端连接
        public void CloseConnection()
        {
            isRec = false;
            sokMsg.Close();
            sokMsg.Dispose();
        }


        void OnCompleted(string strMsg)
        {
            if (Completed != null)
            {
                Completed(null, strMsg);
            }
        }

    }
}
